﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

#region

using Neto.Db.SqlSugar.Interfaces;

#endregion

namespace Neto.Core.CoreServices;

/// <summary>
///     差异/审计日志监听
/// </summary>
public class EntityDiffLogListener : ISqlSugarDiffLogListener
{
    public void DiffLog(ISqlSugarClient db, DiffLogModel diffLogModel)
    {
        //【注意：如果存数据库，需要排除存的那个表，不然可能会导致循环写入】

        //操作前记录  包含： 字段描述 列名 值 表名 表描述
        var editBeforeData = diffLogModel.BeforeData; //插入Before为null，之前还没进库
        //操作后记录   包含： 字段描述 列名 值  表名 表描述
        var editAfterData = diffLogModel.AfterData;
        var sql = diffLogModel.Sql;
        var parameter = diffLogModel.Parameters;
        var data = diffLogModel.BusinessData; //这边会显示你传进来的对象
        var time = diffLogModel.Time;
        var diffType = diffLogModel.DiffType; //enum insert 、update and delete

        //Write logic
        LogX.Debug(
            $"操作类型：{diffType:G}\r\nsql:{sql}\r\n参数：{parameter.ToJson()}\\传进来的对象：{data.ToJson()}\r\n执行时间:{time?.TotalSeconds}\r\n操作前：{editBeforeData.ToJson()}\r\n操作后：{editAfterData.ToJson()}",
            "SqlSugar\\AOP\\差异日志");

        //var logDiff = new SysLogDiff
        //{
        //    // 操作后记录（字段描述、列名、值、表名、表描述）
        //    AfterData = JsonConvert.SerializeObject(diffLogModel.AfterData),
        //    // 操作前记录（字段描述、列名、值、表名、表描述）
        //    BeforeData = JsonConvert.SerializeObject(diffLogModel.BeforeData),
        //    // 传进来的对象
        //    BusinessData = JsonConvert.SerializeObject(diffLogModel.BusinessData),
        //    // 枚举（insert、update、delete）
        //    DiffType = diffLogModel.DiffType.ToString(),
        //    Sql = UtilMethods.GetSqlString(DbType.MySql, diffLogModel.Sql, diffLogModel.Parameters),
        //    Parameters = JsonConvert.SerializeObject(diffLogModel.Parameters),
        //    Duration = diffLogModel.Time == null ? 0 : (int)diffLogModel.Time.Value.TotalMilliseconds
        //};

        //Console.ForegroundColor = ConsoleColor.Red;
        //Console.WriteLine(DateTime.Now + $"\r\n**********差异日志开始**********\r\n{Environment.NewLine}{JsonConvert.SerializeObject(logDiff)}{Environment.NewLine}**********差异日志结束**********\r\n");
    }

    /// <summary>
    ///     获取差异日志
    /// </summary>
    /// <param name="beforeData"></param>
    /// <param name="afterData"></param>
    /// <returns></returns>
    public static string getDiff(List<DiffLogTableInfo> beforeData, List<DiffLogTableInfo> afterData)
    {
        string mianID = null;
        if (beforeData != null)
        {
            var keyCoulumn = beforeData[0].Columns.FirstOrDefault(p => p.IsPrimaryKey);
            if (keyCoulumn != null) mianID = keyCoulumn.Value.ToString();
        }
        else if (afterData != null)
        {
            var keyCoulumn = afterData[0].Columns.FirstOrDefault(p => p.IsPrimaryKey);
            if (keyCoulumn != null) mianID = keyCoulumn.Value.ToString();
        }

        var strLog = new StringBuilder();
        if (beforeData == null || afterData == null) return strLog.ToString();
        {
            var befroeColumns = beforeData[0].Columns;
            var afterCloums = afterData[0].Columns;
            foreach (var item in befroeColumns)
            {
                //忽略字段
                // if (IgnoreColumns.Contains(item.ColumnName.ToLower()))
                //     continue;
                var afterItem =
                    afterCloums.FirstOrDefault(p => p.ColumnName == item.ColumnName && !p.Value.Equals(item.Value));
                if (afterItem != null)
                    strLog.Append($"[字段:{item.ColumnDescription},修改前:{item.Value}，修改后:{afterItem.Value}]");
            }
        }

        return strLog.ToString();
    }
}